package designpatterns.behavior;

/**
 * 解释器模式：提供了评估语言的语法或表达式的方式。这种模式实现了一个表达式接口，该接口解释一个特定的上下文。
 *           这种模式被用在 SQL 解析、符号处理引擎等。
 * 优点：1、可扩展性比较好，灵活。
 *      2、增加了新的解释表达式的方式。
 *      3、易于实现简单文法。
 * 缺点：1、可利用场景比较少。
 *      2、对于复杂的文法比较难维护。
 *      3、解释器模式会引起类膨胀。
 *      4、解释器模式采用递归调用方法。
 * 使用场景：1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
 *          2、一些重复出现的问题可以用一种简单的语言来进行表达。
 *          3、一个简单语法需要解释的场景。
 * @author jack.wu
 * @since 2019/12/13 09:18
 */
public class Interpreter {

}

interface Expression {
    boolean interpret(String context);
}

class TerminalExpression implements Expression {

    private String data;

    public TerminalExpression(String data){
        this.data = data;
    }

    @Override
    public boolean interpret(String context) {
        return context.contains(data);
    }
}

class OrExpression implements Expression {

    private Expression expr1 = null;
    private Expression expr2 = null;

    public OrExpression(Expression expr1, Expression expr2) {
        this.expr1 = expr1;
        this.expr2 = expr2;
    }

    @Override
    public boolean interpret(String context) {
        return expr1.interpret(context) || expr2.interpret(context);
    }
}

class AndExpression implements Expression {

    private Expression expr1 = null;
    private Expression expr2 = null;

    public AndExpression(Expression expr1, Expression expr2) {
        this.expr1 = expr1;
        this.expr2 = expr2;
    }

    @Override
    public boolean interpret(String context) {
        return expr1.interpret(context) && expr2.interpret(context);
    }
}
